#include "srtprocessor.h"
#include <QFile>
#include <QDebug>
#include <QDir>
#include <QTextStream>
#include <QJsonDocument>
#include <QJsonObject>
#include <QRegularExpression>

bool SrtProcessor::processSrtToJson(const QString& untranslatedPath, const QString& translatedPath, const QString& outputPath) {
    try {
        // 提取两个SRT文件的内容
        QStringList sourceTexts = extractSrtContent(untranslatedPath);
        QStringList translatedTexts = extractSrtContent(translatedPath);

        // 检查内容数量是否匹配
        if (sourceTexts.size() != translatedTexts.size()) {
            qDebug() << "源文件和翻译文件的内容数量不匹配";
            return false;
        }

        // 生成JSON数组
        QJsonArray jsonArray = generateJsonArray(sourceTexts, translatedTexts);

        // 确保输出目录存在
        QDir().mkpath(QFileInfo(outputPath).path());

        // 写入JSON文件
        QFile outputFile(outputPath);
        if (!outputFile.open(QIODevice::WriteOnly)) {
            qDebug() << "无法创建输出文件:" << outputPath;
            return false;
        }

        QJsonDocument doc(jsonArray);
        outputFile.write(doc.toJson());
        outputFile.close();

        qDebug() << "SRT文件处理完成，已保存到:" << outputPath;
        return true;
    } catch (const std::exception& e) {
        qDebug() << "处理SRT文件时发生错误:" << e.what();
        return false;
    }
}

QStringList SrtProcessor::extractSrtContent(const QString& filePath) {
    QStringList contents;
    QFile file(filePath);
    
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "无法打开文件:" << filePath;
        return contents;
    }

    QTextStream in(&file);
    QString content;
    bool isContent = false;
    
    // 用于匹配时间戳行的正则表达式
    QRegularExpression timeStampPattern(R"(\d{2}:\d{2}:\d{2},\d{3}\s-->\s\d{2}:\d{2}:\d{2},\d{3})");

    while (!in.atEnd()) {
        QString line = in.readLine().trimmed();
        
        if (line.isEmpty()) {
            if (!content.isEmpty()) {
                contents.append(content);
                content.clear();
            }
            isContent = false;
            continue;
        }

        // 跳过序号行和时间戳行
        if (line.toInt() > 0 || timeStampPattern.match(line).hasMatch()) {
            isContent = true;
            continue;
        }

        if (isContent) {
            if (!content.isEmpty()) {
                content += " ";
            }
            content += line;
        }
    }

    // 处理最后一个内容块
    if (!content.isEmpty()) {
        contents.append(content);
    }

    file.close();
    return contents;
}

bool SrtProcessor::isValidTranslation(const QString& source, const QString& translation) {
    int sourceLength = source.length();
    int translationLength = translation.length();
    
    // // 检查源文本是否少于10个字符
    // if (sourceLength < 10) {
    //     qDebug() << "源文本长度少于10个字符，跳过:" << source;
    //     return false;
    // }
    
    // 检查翻译前后的文本长度差异是否超过50%
    if (sourceLength == 0 || translationLength == 0) {
        return false;
    }
    
    // float ratio = static_cast<float>(translationLength) / sourceLength;
    // if (ratio < 0.5 || ratio > 1.5) {
    //     qDebug() << "翻译前后文本长度差距过大，跳过:" << source;
    //     return false;
    // }
    
    return true;
}

QJsonArray SrtProcessor::generateJsonArray(const QStringList& sources, const QStringList& translations) {
    QJsonArray jsonArray;
    QString currentSource;
    QString currentTranslation;
    
    qDebug() << "开始处理文本，总段落数:" << sources.size();
    
    for (int i = 0; i < sources.size(); ++i) {
        QString processedTranslation = translations[i];
        // 替换「」为引号
        processedTranslation.replace("「", "“");
        processedTranslation.replace("」", "”");
        
        // 检查翻译是否有效
        if (!isValidTranslation(sources[i], processedTranslation)) {
            qDebug() << "跳过无效翻译:" << processedTranslation;
            continue;
        }

        // 如果当前文本长度小于64，尝试合并
        if (currentSource.length() + sources[i].length() < 64) {
            // 如果不是第一段文本，添加空格分隔
            if (!currentSource.isEmpty()) {
                currentSource += " ";
                currentTranslation += " ";
                qDebug() << "合并第" << i << "段文本，当前累积长度:" 
                        << currentSource.length() << "，合并后内容:" << currentSource;
            }
            currentSource += sources[i];
            currentTranslation += processedTranslation;  // 使用处理后的翻译文本
        } else {
            // 如果已经有累积的文本，先保存它
            if (!currentSource.isEmpty()) {
                QJsonObject item;
                item["instruction"] = "你是一名中文翻译专家，将以下文字翻译为简体中文：";
                item["input"] = currentSource;
                item["output"] = currentTranslation;
                jsonArray.append(item);
            }
            
            // 开始新的累积
            currentSource = sources[i];
            currentTranslation = processedTranslation;  // 使用处理后的翻译文本
        }
    }
    
    // 处理最后一段累积的文本
    if (!currentSource.isEmpty()) {
        QJsonObject item;
        item["instruction"] = "你是一名中文翻译专家，将以下文字翻译为简体中文：";
        item["input"] = currentSource;
        item["output"] = currentTranslation;
        jsonArray.append(item);
    }
    
    qDebug() << "处理完成，原始段落数:" << sources.size() 
            << "，合并后条目数:" << jsonArray.size();
    return jsonArray;
} 